﻿using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Interfaces.Servicos;
using LM.InterfacesFabricas.Utilidades;
using LM.Negocio.Objetos;
using LM.Negocio.Validadores;
using LM.Repositorios;
using LM.Repositorios.Interfaces;
using System;
using System.Linq;
using System.Collections.Generic;

namespace LM.Servicos
{
    public class ServicoDeLocacao : IServicoLocacao
    {
        public void Cadastre(DtoLocacao Locacao)
        {
            var repositorioDeLocacao = FabricaDeRepositorios.Crie<IRepositorioDeLocacao>();
            var validadorDeLocacao = new ValidadorDeLocacao(repositorioDeLocacao);
            var LocacaoObjeto = ConversorDeObjetos.Copie<Locacao>(Locacao);

            validadorDeLocacao.ValideCadastro(LocacaoObjeto);
            repositorioDeLocacao.Cadastre(LocacaoObjeto);
        }

        public void Atualize(DtoLocacao Locacao)
        {
            var repositorioDeLocacao = FabricaDeRepositorios.Crie<IRepositorioDeLocacao>();
            var validadorDeLocacao = new ValidadorDeLocacao(repositorioDeLocacao);
            var LocacaoObjeto = ConversorDeObjetos.Copie<Locacao>(Locacao);

            validadorDeLocacao.ValideAtualizacao(LocacaoObjeto);
            repositorioDeLocacao.Atualize(LocacaoObjeto);
        }

        public void Exclua(int codigo)
        {
            var repositorioDeLocacao = FabricaDeRepositorios.Crie<IRepositorioDeLocacao>();
            var validadorDeLocacao = new ValidadorDeLocacao(repositorioDeLocacao);
            var LocacaoObjeto = ConversorDeObjetos.Copie<Locacao>(repositorioDeLocacao.Consulte(codigo));

            validadorDeLocacao.ValideExclusao(LocacaoObjeto);
            repositorioDeLocacao.Exclua(LocacaoObjeto);
        }

        public DtoLocacao Consulte(int codigo)
        {
            var LocacaoObjeto = FabricaDeRepositorios.Crie<IRepositorioDeLocacao>().Consulte(codigo);
            return ConversorDeObjetos.Copie<DtoLocacao>(LocacaoObjeto);
        }

        public IList<DtoLocacao> ConsulteTodos()
        {
            return ConversorDeObjetos.Copie<DtoLocacao, Locacao>(FabricaDeRepositorios.Crie<IRepositorioDeLocacao>().ConsulteTodos());
        }

        public IList<DtoLocacao> ConsulteTodos(bool preencherForeignKey)
        {
            if (!preencherForeignKey)
                return ConsulteTodos();

            return ConsulteTodos().ToList().ConvertAll<DtoLocacao>(delegate(DtoLocacao e)
            {
                PreencherForeingKey(e);
                return e;
            });
        }

        private void PreencherForeingKey(DtoLocacao locacao)
        {
            if (locacao.TabelaPrecoID != 0)
                locacao.TabelaPreco = ConversorDeObjetos.Copie<DtoTabelaPreco>(FabricaDeRepositorios.Crie<IRepositorioDeTabelaPreco>().Consulte(locacao.TabelaPrecoID));
            if (locacao.ClienteID != 0)
                locacao.Cliente = ConversorDeObjetos.Copie<DtoCliente>(FabricaDeRepositorios.Crie<IRepositorioDeCliente>().Consulte(locacao.ClienteID));
            if (locacao.DependenteID != 0)
                locacao.Dependente = ConversorDeObjetos.Copie<DtoDependente>(FabricaDeRepositorios.Crie<IRepositorioDeDependente>().Consulte(locacao.DependenteID));
            if (locacao.VagaID != 0)
                locacao.Vaga = ConversorDeObjetos.Copie<DtoVaga>(FabricaDeRepositorios.Crie<IRepositorioDeVaga>().Consulte(locacao.VagaID));
        }

        #region IServicoLocacao Members


        IList<DtoLocacao> IServicoLocacao.ConsulteTodos( bool preencherForeignKey )
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}
